"""团队作业展示
组名：老六组
队长：赵胜弘
成员：陶祖卫
     戚猷任
     温焯越
团队口号：精研 Python 之道，筑就非凡梦想
"""

import sys
"""成员A：温焯越
    负责成绩信息输入功能"""
#input_grades函数解析，这个函数的主要作用是从用户那里获取课程名称以及对应的百分制成绩，
#通过循环不断提示用户输入，直到用户输入空行结束输入过程。
#同时，对用户输入的成绩进行合法性验证，确保是有效的数字，最终以字典形式返回所有输入的课程成绩信息。

def input_grades():         # 创建一个空字典，用于存储课程名称和对应成绩
    grades_dict = {}
    print("请输入课程成绩信息（输入课程名称后按回车键，然后输入对应成绩，输入完成按回车键结束）")
    while True:
        course_name = input("课程名称: ")     # 获取用户输入的课程名称
        if not course_name:                 # 如果用户直接输入回车键（即课程名称为空），则结束输入循环
            break
        try:
            grade = float(input("成绩（百分制）: "))       # 获取用户输入的成绩，并尝试转换为浮点数类型
            grades_dict[course_name] = grade            # 将课程名称和对应的成绩存入字典中，课程名称为键，成绩为值
        except ValueError:
            print("输入的成绩不是有效数字，请重新输入！")
            continue        # 提示用户重新输入，继续循环获取正确的成绩输入
    return grades_dict      # 返回存储了所有课程名称和对应成绩的字典


"""成员B:陶祖卫
    负责的成绩汇总与平均绩点计算功能"""
#summarize_grades函数解析，这个函数的功能是将本次新输入的成绩与已有的历史成绩进行汇总处理。
#首先尝试读取历史成绩文件，然后输入新的成绩，
#根据课程是否已存在决定是覆盖原有成绩还是直接添加新成绩，最终返回汇总后的成绩字典，
#同时提供了覆盖成绩记录的交互功能，并对用户的不同选择进行相应处理，若用户取消操作则直接退出程序。

def summarize_grades(new_grades):
    history_grades = {}             # 初始化一个空字典，用于存储历史成绩信息
    try:
        with open("grades.txt", "r") as file:       # 尝试以只读模式打开名为"grades.txt"的文件
            for line in file.readlines():            # 逐行读取文件内容
                parts = line.strip().split(":")     # 对每行内容按":"进行分割，得到课程名称和成绩的字符串表示
                history_grades[parts[0]] = float(parts[1])      # 将课程名称作为键，对应的成绩转换为浮点数后作为值，存入history_grades字典
    except FileNotFoundError:                               # 如果文件不存在，捕获该异常
        pass
    for course, grade in new_grades.items():
        if course in history_grades:
            print(f"{course} 已有成绩记录：{history_grades[course]}")
            a = input("是否覆盖该成绩记录？(y/n)：")
            if a.lower() == "y":
                history_grades[course] = grade
            else:
                sys.exit("已取消操作，程序退出。")
        else:
            history_grades[course] = grade
    return history_grades


"""成员C:戚猷任
    负责的成绩记录保存与读取功能"""
#函数read_grades解析，该函数的主要任务是将汇总后的成绩信息以及计算得到的平均绩点写入到指定的文本文件中，方便后续可以读取查看这些数据。

def write_grades(grades, average_gpa):
    with open("grades.txt", "w") as file:    #以写入模式打开名为"grades.txt"的文件，使用with语句确保文件操作完成后自动关闭
        for course, grade in grades.items():
            file.write(f"{course}:{grade}\n")       # 将课程名称和对应的成绩按"课程名称:成绩"的格式逐行写入文件
        file.write(f"平均绩点:{average_gpa}\n")   # 在文件末尾写入平均绩点信息，格式为"平均绩点:绩点数值"


def read_grades():
    grades = {}
    average_gpa = 0
    try:
        with open("grades.txt", "r") as file:
            for line in file.readlines():
                parts = line.strip().split(":")     # 对每行内容按":"进行分割
                if len(parts) == 2:                 # 如果分割后得到两个部分，说明是课程名称和成绩信息
                    grades[parts[0]] = float(parts[1])  # 将课程名称作为键，对应的成绩转换为浮点数后作为值，存入grades字典
                elif len(parts) == 3 and parts[0] == "平均绩点":        # 如果分割后得到三个部分且第一个部分是"平均绩点"，说明是平均绩点信息
                    average_gpa = float(parts[1])
    except FileNotFoundError:
        pass
    return grades, average_gpa


"""成员D:赵胜弘
    负责成绩结果展示"""
# display_results 函数解析,这个函数整合了其他成员负责的函数功能,首先获取本次用户输入的成绩，接着与历史成绩汇总，然后展示所有课程的成绩信息
# 再计算并展示平均绩点，之后将汇总后的成绩和平均绩点保存到文件中，通过调用不同成员的函数实现了完整的成绩管理系统流程展示
# 并且提供输出格式和提示信息，方便查看成绩情况以及了解数据保存状态。
def display_results():

    current_grades = input_grades()     # 调用成员A的函数，获取本次用户输入的课程成绩信息

    all_grades = summarize_grades(current_grades)   # 调用成员B的函数，将本次输入的成绩与历史成绩进行汇总处理，返回汇总后的成绩字典

    print("所有课程成绩如下：")
    for course, grade in all_grades.items():
        print(f"{course}: {grade}")

    total_grades = list(all_grades.values())                # 计算绩点相关
    gpa_list = [(g - 50) / 10 for g in total_grades]        # 从汇总后的成绩字典中提取所有成绩值，组成一个列表
    average_gpa = sum(gpa_list) / len(gpa_list) if gpa_list else 0   # 计算每门课程对应的绩点，组成一个绩点列表

    write_grades(all_grades, average_gpa)    # 调用成员C的函数，将汇总后的成绩字典和计算得到的平均绩点写入文件

    print(f"总平均绩点: {average_gpa}")        # 打印平均绩点


if __name__ == "__main__":
    while True:             #重复调用
        display_results()
        choice = input("是否继续输入成绩信息？(y/n)：")
        if choice.lower()!= "y":
            break
